package com.heqiang.service.impl;


import com.heqiang.domain.Admin;
import com.heqiang.repository.AdminRepository;
import com.heqiang.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.Optional;

/**
 * @Author zhangheqiang
 * @Date 2020/3/18
 **/
@Service
public class AdminServiceImpl implements AdminService {

    @Autowired
    private AdminRepository repository;


    /***************************************************** Query ******************************************************/
    //查询-全部
//    @Override
//    public List<Admin> findAll(Admin admin) {
//        Specification<Admin> specification = new Specification<Admin>() {
//            @Override
//            public Predicate toPredicate(Root<Admin> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//                //匿名内部类实现接口
//                //root :查询的跟对象,可以获取任意属性
//                //criteriaBuilder: 查询构造器,内部封装了很多查询条件
//                Path<Object> account = root.get("account");
//                Path<Object> phone = root.get("phone");
//                //equal ：直接得到path对象（属性），然后进行比较即可
//                //gt，lt,ge,le,like : 得到path对象，根据path指定比较的参数类型，再去进行比较
//                //指定参数类型：path.as(类型的字节码对象)
//                Predicate p1 = criteriaBuilder.like(account.as(String.class), admin.getAccount() + "%");
//                Predicate p2 = criteriaBuilder.like(phone.as(String.class), admin.getPhone() + "%");
//                Predicate p = criteriaBuilder.and(p1, p2);
//                //第一个参数：需要比较的属性（path对象）
//                //第二个参数：当前需要比较的取值
//                return p;
//            }
//        };
//        PageRequest pageRequest = PageRequest.of(0, 4);
//        //分页查询
////        Sort sort = new Sort(Sort.Direction.DESC, "id");
////        List<Admin> list repository.findAll(specification, sort);
//        Page<Admin> pages = repository.findAll(specification, pageRequest);
////        System.out.println(pages.getTotalElements());//总条数
////        System.out.println(pages.getTotalPages());//总页数
////        System.out.println(pages.getContent());//得到数据集合
//        List<Admin> list = pages.getContent();
//        return list;
//    }

    //查询-全部
    @Override
    public Page<Admin> findAll(Admin admin) {
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("account", ExampleMatcher.GenericPropertyMatchers.startsWith())//模糊查询匹配开头，即{username}%
                .withMatcher("phone" ,ExampleMatcher.GenericPropertyMatchers.contains())//全部模糊查询，即%{address}%
                .withIgnorePaths("password")//忽略字段，即不管password是什么值都不加入查询条件
                .withIgnorePaths("id");  //忽略属性：是否关注。因为是基本类型，需要忽略掉
        Example<Admin> example = Example.of(admin ,matcher);
        PageRequest pageRequest = PageRequest.of(0, 4);
        Page<Admin> page = repository.findAll(example, pageRequest);
        return page;
    }


    //查询-根据id
    @Override
    public Admin findById(Long id) {
        Optional<Admin> optional = repository.findById(id);
        if (optional.isPresent()) {
            return optional.get();
        }
        return new Admin();
    }


    /***************************************************** Modify *****************************************************/
    //添加-用户
    @Override
    public boolean add(Admin admin) {
        repository.save(admin);
        return true;
    }


    //删除-用户
    @Override
    public boolean del(Long id) {
        repository.deleteById(id);
        return true;
    }


    //编辑-用户
    @Override
    public boolean modify(Admin admin) {
        Optional<Admin> optional = repository.findById(admin.getId());
        if (optional.isPresent()) {
            return false;
        }
        repository.save(admin);
        return true;
    }
}
